package com.woniuxy.sddfp.system;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.woniuxy.sddfp.system.rule.MyRule;
import feign.Logger;
import org.mybatis.spring.annotation.MapperScan;
//import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
//import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.client.RestTemplate;

/**
 * @author yellow Doctor
 * @date 2025-06-23
 * @desc 蜗牛创想：www.woniuxy.com
 */
@EnableCircuitBreaker  //开启注解  服务熔断降级
@EnableFeignClients(
        basePackages = "com.woniuxy.bank.api.access"
)
@ComponentScan({
        "com.woniuxy.sddfp.system",  //扫描 默认的包 就是自己
         "com.woniuxy.sddfp.common",  //扫描 异常的 全局处理类
         "com.woniuxy.bank.api.access"  //扫描  openfeign 的调用失败的处理类
})
@MapperScan("com.woniuxy.sddfp.system.mapper")  //扫描mapper接口
@SpringBootApplication
public class SystemApplication {

    /**
     *  springboot的 有哪些基本的注解 ？
          1、  这个注解@SpringBootApplication 是一个符合注解
                        @SpringBootConfiguration   这个config 一般和 @bean 一起使用
                        @EnableAutoConfiguration   这个是一个 自动装配注解
                                   boot 和自动装配有关系   自动装配
                        @ComponentScan
                                  扫描
                         "com.woniuxy.sddfp.common",  //扫描 异常的 全局处理类

          2、@import 注解
                      1、     @EnableAutoConfiguration 自动装配中添加扫描的类
                      2、     @EnableFeignClients  @Import(FeignClientsRegistrar.class) 添加client
                   这个注解在 spring底层用的比较多

          3、其他的注解说几个
                    1、controller
                    2、service

     *
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(SystemApplication.class, args);
    }

    /**
     *  创建对象 添加到ioc容器中
     *
     *  创建对象添加到ioc容器中 有多少种方式?
     *      1、  @Bean + @Configuration  可以创建对象  纯注解的方式实现
     *      2、  @Controller + @ComponentScan  注解 + 扫描
     *      3、  xml 配置bean    也可以
     *      4、  @Import(User.class)    这个可以把 class 添加到ioc容器中 (自动装配底层使用)
     *      5、  实现 这个接口 FactoryBean   这个在 第三框架中 整合 springboot的使用使用  （mybatis 整合 springboot中可以使用）
     *
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    /**
     *    @Bean  用在方法上面  把 这个方法的返回对象 交给spring IOC容器中管理
     *    一个这个注解 和  @Configuration 来使用
     *    这个注解是纯 java注解的方式配置
     *
     *    如果这个注解 在 springbootApplication 也可以
     *    @springbootApplication 这个符合注解内部有  @Configuration  和上面的 等价
     *
     * @return
     */
//    @Bean
//    public MessageConverter messageConverter(){
//        return new Jackson2JsonMessageConverter();
//    }

    @Bean
    public Logger.Level loggerLevel(){
        return Logger.Level.BASIC;
    }

    RandomRule  randomRule;               //        随机
    RoundRobinRule      roundRobinRule;   //        轮询
    //WeightedResponseTimeRule           权重  (响应速度越快的实例选择权重越大)

    @Bean
    public IRule rules(){
        return new MyRule();
    }
}


